package login

import (
    "time"
	"game"
	"message"
	"db"
	"config"
	"message/netlib"
	"github.com/name5566/leaf/log"
	"github.com/golang/protobuf/proto"
)

func init() {
	register(message.MSG_LOGIN, handleLogin)
	register(message.MSG_REGISTER_ACCOUNT, handleRegisterAccount)
}

func register(msgID message.MSG, handler func([]interface{})) {
	skeleton.RegisterChanRPC(msgID, handler)
}

// 请求登录
func handleLogin(args []interface{}) {
	msg := netlib.Deserialize(args[0], message.C2S_Login{}).(*message.C2S_Login)

	log.Debug("handleLogin: %s   %s", msg.GetAccount(), msg.GetPassword())

	account := msg.GetAccount()
	token := msg.GetAccount()
	psw := msg.GetPassword()
	loginType := msg.GetLoginType()

	// 从数据库获取账号
	accountData := db.FindAccount(account)
	if accountData == nil {
		if loginType == message.LoginType_LOGIN_ACCOUNT {
			// 账号不存在
			netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_ERR_ACCOUNT_NOT_EXIST)
			return
		} else if loginType == message.LoginType_LOGIN_GUEST {
			// 游客登录，如果用户没有账户，则直接创建账户

			accountData = db.CreateAccount(account, psw, loginType)
			if accountData == nil {
				// 账号没有创建成功
				netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_FAIL)
				return
			}
		}
	}

	if accountData == nil {
		netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_FAIL)
		return
	}

	// 如果是账号密码登录，需要检查密码长度
	if loginType == message.LoginType_LOGIN_ACCOUNT {
		// 检查账号长度
		accLen := len(account)
		if accLen < config.MIN_ACCOUNT_SIZE || accLen > config.MAX_ACCOUNT_SIZE {
			netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_ERR_ACCOUNT_ERR)
			return
		}

		pswLen := len(psw)
		if pswLen < config.MIN_PASSWORD_SIZE || pswLen > config.MAX_PASSWORD_SIZE {
			netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_ERR_PSW_ERR)
			return
		}

		// 密码不匹配
		if psw != accountData.Account {
			netlib.SendError(args[1], message.MSG_LOGIN, message.ErrorCode_ERR_PSW_ERR)
			return
		}
	}

	// 登录成功，回应客户端一个token
	netlib.SendMsg(args[1], message.MSG_LOGIN, &message.S2C_Login{Token: proto.String(token)})

	// 向游戏服发送登录请求
	game.RPC.Go("UserLogin", args[1], account, token)

	accountData.LoginTime = time.Now().Unix()

	// 保存账号数据
	db.SaveAccount(accountData)
}


// 请求注册账户
func handleRegisterAccount(args []interface{}) {
	msg := netlib.Deserialize(args[0], message.C2S_RegisterAccount{}).(*message.C2S_RegisterAccount)

	log.Debug("handleRegisterAccount: %s   %s", msg.GetAccount(), msg.GetPassword())

	account := msg.GetAccount()
	psw := msg.GetPassword()

	// 检查账号长度
	accLen := len(account)
	if accLen < config.MIN_ACCOUNT_SIZE || accLen > config.MAX_ACCOUNT_SIZE {
		netlib.SendError(args[1], message.MSG_REGISTER_ACCOUNT, message.ErrorCode_ERR_ACCOUNT_ERR)
		return
	}

	// 检查密码长度
	pswLen := len(psw)
	if pswLen < config.MIN_PASSWORD_SIZE || pswLen > config.MAX_PASSWORD_SIZE {
		netlib.SendError(args[1], message.MSG_REGISTER_ACCOUNT, message.ErrorCode_ERR_PSW_ERR)
		return
	}

	// 从数据库获取账号
	accountData := db.FindAccount(account)
	if accountData != nil {
		// 账号已存在
		netlib.SendError(args[1], message.MSG_REGISTER_ACCOUNT, message.ErrorCode_ERR_REGISTER_ACCOUNT_EXIST)
		return
	}

	accountData = db.CreateAccount(account, psw, message.LoginType_LOGIN_ACCOUNT)
	if accountData == nil {
		// 账号没有创建成功
		netlib.SendError(args[1], message.MSG_REGISTER_ACCOUNT, message.ErrorCode_FAIL)
		return
	}

	// 注册成功
	netlib.SendMsg(args[1], message.MSG_REGISTER_ACCOUNT, nil)

	// 保存账号数据
	db.SaveAccount(accountData)
}

// 请求重置账号密码
func handleResetPassword(args []interface{}) {

}
